perm filename GETTIM.SAI[AL,HE] blob
sn#744184 filedate 1984-02-23 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "PUPSUB"
C00011 ENDMK
C⊗;
BEGIN "PUPSUB"
DEFINE ! = " COMMENT ";
! Definitions for using PUPs;
! Constants concerning PUP data structure;
DEFINE MAXPUPWORDS = 139; ! Maximum PUP is 554 bytes;
DEFINE PUPOVERHEAD = 22; ! Number of non-data bytes in a PUP;
! MTAPE UUO opcodes;
DEFINE PUPLISTEN = 1;
DEFINE SKIPREADY = '10;
! Well-known socket numbers;
DEFINE MISCSERV = 4;
! PUP types;
DEFINE TIMEREQUEST = '200;
DEFINE TIMEREPLY = '201;
DEFINE CRLF="('15&'12)";
PROCEDURE SNOOZE(INTEGER TIME(0));
! sleeps for 1/60 of a second (until next tick, I guess);
! unless argument is nonzero, then it sleeps that many seconds;
BEGIN "SNOOZE"
QUICK_CODE "SLEEP"
MOVE '13,TIME;
CALLI '13,'31
END "SLEEP";
END "SNOOZE"; ! what a kludge;
STRING TIME;
INTEGER ARRAY HOSTSOCKET[0:5];
BOOLEAN FOUND;
EXTERNAL INTEGER _SKIP_;
INTEGER ARRAY PUP[0:MAXPUPWORDS];
INTEGER ARRAY MTP[0:6];
INTEGER OPCODE,COUNT,BRCHAR,EOF,LEN,PUPCHN,I,J,PTR,NCHAR,HOST,PUPS,NET;
BOOLEAN GOTIT;
! Call the time-of-day server for the current time.;
PUPS ← 0;
PUPCHN ← GETCHAN;
EOF ← 1;
OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
PRINT("OPEN failed on PUP"&CRLF);
END
ELSE BEGIN ! Set up an MTAPE to open a connection with the misc. services;
MTP[0] ← PUPLISTEN; ! Function;
MTP[2] ← -1; ! Local socket number (generate one);
MTP[3] ← 0; ! Wait flag;
MTP[4] ← 8; ! Byte size;
MTP[5] ← MISCSERV; ! Remote socket number (misc. services);
MTP[6] ← -1; ! Remote host (broadcast);
! Set up MTAPE uuo...;
OPCODE ← '072000000000 + (PUPCHN LSH 23);
CODE(OPCODE,MTP[0]);
IF MTP[1] NEQ 0 THEN
BEGIN
FOUND ← FALSE;
PRINT("Failed to connect to time-of-day server");
END
ELSE BEGIN
! Set up the PUP to send the time request;
DPB(TIMEREQUEST,POINT(16,PUP[0],31)); ! PUP type;
FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; ! Let WAITS fill in the rest;
ARRYOUT(PUPCHN,PUP[0],(PUPOVERHEAD+3) DIV 4);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
PRINT("Output to PUP failed"&CRLF);
END
ELSE
BEGIN
! Get reply from misc. server;
MTP[0] ← SKIPREADY;
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
BEGIN
SNOOZE(1);
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
BEGIN
SNOOZE(1);
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
GOTIT ← FALSE
ELSE
GOTIT ← TRUE
END
ELSE
GOTIT ← TRUE
END
ELSE
GOTIT ← TRUE;
IF NOT GOTIT THEN
BEGIN
FOUND ← FALSE;
PRINT("No reply from time server"&CRLF);
END
ELSE
BEGIN
! Receive the PUP;
ARRYIN(PUPCHN,PUP[0],MAXPUPWORDS);
! Extract PUP type, check if successful;
IF LDB(POINT(8,PUP[0],31)) = TIMEREPLY THEN
BEGIN
FOUND ← TRUE;
LEN ← LDB(POINT(16,PUP[0],15))-PUPOVERHEAD;
PTR ← POINT(8,PUP[5],-1);
TIME ← NULL;
FOR I ← 1 STEP 1 UNTIL LEN DO TIME ← TIME & ILDB(PTR);
PRINT(LEN," '",TIME,"'",CRLF);
END;
END
END
END END;
RELEASE(PUPCHN);
END "PUPSUB"